/*
 * system init
 */
#include "stdint.h"
#include "sys_init.h"

void task_sw_hook(char pos);

/*******************************************************************************
* @brief  sysinit_start
* \param[in] pos : number
* \retval: none
*******************************************************************************/
static void sysinit_start(char pos)
{

}
OBJ_INIT_EXPORT(sysinit_start, "0");


/*******************************************************************************
* @brief  sysinit_board_end
* \param[in] pos : number
* \retval: none
*******************************************************************************/
static void sysinit_board_end(char pos)
{

}
OBJ_INIT_EXPORT(sysinit_board_end, "1.end");


/*******************************************************************************
* @brief  sysinit_end
* \param[in] pos : number
* \retval: none
*******************************************************************************/
static void sysinit_end(char pos)
{

}
OBJ_INIT_EXPORT(sysinit_end, "6.end");


/*******************************************************************************
* @brief  sysapp_end
* \param[in] pos : number
* \retval: none
*******************************************************************************/
static void sysapp_end(char pos)
{

}
OBJ_INIT_EXPORT(sysapp_end, "7.end");


/*******************************************************************************
* @brief  sys_hal_init
* \param[in] pos : number
* \retval: none
*******************************************************************************/
void sys_hal_init(void)
{
    char pos = 1;
    volatile const sys_init_fn *fn_ptr;

    for (fn_ptr = &__sys_init_sysinit_start; fn_ptr < &__sys_init_sysinit_board_end; fn_ptr++)
    {
        (*fn_ptr)(pos++);
    }
}

/*******************************************************************************
* @brief  sys_app_init
* \param[in] pos : number
* \retval: none
*******************************************************************************/
void sys_app_init(void)
{
    char pos = 1;
    volatile const sys_init_fn *fn_ptr;

    for (fn_ptr = &__sys_init_sysinit_board_end; fn_ptr < &__sys_init_sysinit_end; fn_ptr ++)
    {
        (*fn_ptr)(pos++);
    }

}

/*******************************************************************************
* @brief  sys_init
* \param[in] pos : number
* \retval: none
*******************************************************************************/
void sys_init(void)
{
    sys_hal_init();
    sys_app_init();
}

/*******************************************************************************
* @brief  sys_app_run
* \param[in] pos : number
* \retval: none
*******************************************************************************/
void sys_app_run(void)
{
    volatile const sys_init_fn *fn_ptr;

    while(1)
    {
        char pos = 1;
        
        for (fn_ptr = &__sys_init_sysinit_end; fn_ptr < &__sys_init_sysapp_end; fn_ptr ++)
        {
            (*fn_ptr)(pos++);
            task_sw_hook(pos);
        }
    }
}

/*******************************************************************************
* @brief  ram_clr
* \param[in] none
* \retval: none
*******************************************************************************/
void ram_clr(void)
{
    volatile register uint32_t *pdata;
    volatile register uint32_t Len;
    
    pdata = (uint32_t*)0x20000000;
    Len = 0x8000/4;
    while(Len--)
    {
        *pdata++ = 0;
    }
}
